package dataInterchange

import (
	"compress/zlib"
	"encoding/json"
	"fmt"

	"7qule.com/sd3/CrossServer/src/common/onlinelog"
	"7qule.com/sd3/CrossServer/src/utils"
	"public.com/Framework/goroutineMgr"
	"public.com/Framework/managecenterMgr"
	"public.com/goutil/webUtil"
	"public.com/goutil/zlibUtil"
)

// --------------------------------内部方法--------------------------------------------------

// --------------------------------内部方法--------------------------------------------------

// 推送数据到指定地址
// url:待推送到的目标地址
// data:待推送的数据
// isCompression:是否压缩数据
// 返回值:
// error:错误信息
func PostWebData_List(url string, data []byte, isCompression bool, serverGroupIdList []int32) {
	go func() {
		registerName := "PostWebData_List"
		goroutineMgr.MonitorZero(registerName)
		defer goroutineMgr.ReleaseMonitor(registerName)
		defer utils.LogErrorRecover()
		var err error
		//压缩
		if isCompression {
			data, err = zlibUtil.Compress(data, zlib.DefaultCompression)
			if err != nil {
				onlinelog.ErrorLog("压缩Data出错,Data:%v，错误信息为：%s", string(data), err)
				return
			}
		}

		//循环推送
		for _, sid := range serverGroupIdList {
			serverGroup, exists := managecenterMgr.GetServerGroupItem(sid)
			if exists == false {
				onlinelog.ErrorLog("未找到sid=%v的服务器组信息", sid)
				continue
			}

			//组装url
			fullUrl := serverGroup.GetGSCallbackUrl(url)
			PostWebData(fullUrl, data, false)
		}
	}()
}

// 推送数据到指定地址
// url:待推送到的目标地址
// data:待推送的数据
// isCompression:是否压缩数据
// 返回值:
// error:错误信息
func PostWebData(url string, data []byte, isCompression bool) (resData []byte, err error) {
	beforeData := data
	if isCompression {
		data, err = zlibUtil.Compress(data, zlib.DefaultCompression)
		if err != nil {
			onlinelog.ErrorLog("压缩Data出错,Data:%v，错误信息为：%s", string(data), err)
			return
		}
	}

	header := webUtil.GetFormHeader()
	transport := webUtil.NewTransport()
	transport.DisableKeepAlives = true
	transport = webUtil.GetTimeoutTransport(transport, 30)
	statusCode, resData, err := webUtil.PostByteData2(url, data, header, transport)
	if err != nil {
		onlinelog.ErrorLog("PostWebData出错1,发送数据:%s到%s出错，错误信息为：%v", string(beforeData), url, err)
		return
	}

	if statusCode != 200 {
		err = fmt.Errorf("PostWebData出错2,发送数据%s，StatusCode为：%d data:%s", url, statusCode, string(beforeData))
		onlinelog.ErrorLog("%s", err)
		return
	}

	return
}

// 以压缩的方式推送数据到指定地址
// url:待推送到的目标地址
// data:待推送的数据
// isCompression:是否压缩数据
// 返回值:
// error:错误信息
func PostWebData_Header(url string, data []byte, header map[string]string, isCompression bool) (resData []byte, err error) {
	beforeData := data
	if isCompression {
		data, err = zlibUtil.Compress(data, zlib.DefaultCompression)
		if err != nil {
			onlinelog.ErrorLog("压缩Data出错,Data:%v，错误信息为：%s", string(data), err)
			return
		}
	}

	//设置头信息
	innerHeader := webUtil.GetFormHeader()
	if header != nil {
		for k, v := range header {
			innerHeader[k] = v
		}
	}
	transport := webUtil.NewTransport()
	transport.DisableKeepAlives = true
	transport = webUtil.GetTimeoutTransport(transport, 3)
	statusCode, resData, err := webUtil.PostByteData2(url, data, innerHeader, transport)
	if err != nil {
		onlinelog.ErrorLog("PostWebData出错1,发送数据:%s到%s出错，错误信息为：%v", string(beforeData), url, err)
		return
	}

	if statusCode != 200 {
		err = fmt.Errorf("PostWebData出错2,发送数据%s，StatusCode为：%d data:%s", url, statusCode, string(beforeData))
		onlinelog.ErrorLog("%s", err)
		return
	}

	return
}

// 以压缩的方式推送数据到指定地址
// url:待推送到的目标地址
// 返回值:
// error:错误信息
func GetWebData(url string) (resData []byte, err error) {
	header := webUtil.GetFormHeader()
	transport := webUtil.NewTransport()
	transport.DisableKeepAlives = true
	transport = webUtil.GetTimeoutTransport(transport, 3)
	statusCode, resData, err := webUtil.GetWebData3(url, "", header, transport)
	if err != nil {
		onlinelog.ErrorLog("GetWebData出错1,发送数据到%s出错，错误信息为：%v", url, err)
		return
	}
	if statusCode != 200 {
		err = fmt.Errorf("GetWebData出错2,发送数据%s，StatusCode为：%d ", url, statusCode)
		onlinelog.ErrorLog("%s", err)
		return
	}

	return
}

// 以压缩的方式推送数据到指定地址
// url:待推送到的目标地址
// initData:待推送的数据
// 返回值:
// error:错误信息
func PostDataByZlib(url string, initData interface{}) error {
	//序列化消息
	data, err := json.Marshal(initData)
	if err != nil {
		return err
	}

	result, err := zlibUtil.Compress(data, zlib.DefaultCompression)
	if err != nil {
		onlinelog.ErrorLog("压缩Data出错,Data:%v，错误信息为：%s", string(data), err)

		return err
	}

	var content []byte
	if content, err = webUtil.PostByteData(url, []byte(result), nil); err != nil {
		onlinelog.ErrorLog("PostDataByZlib出错1,发送数据:%s到%s出错，错误信息为：%v", string(data), url, err)

		return err
	}
	if string(content) != "0" {
		onlinelog.ErrorLog("PostDataByZlib出错2,发送数据:%s到%s没有返回成功，返回数据为：%v", string(data), url, string(content))

		return fmt.Errorf("PostDataByZlib出错2,发送数据%s没有返回成功，返回数据为：%v", url, string(content))
	}

	return nil
}
